﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;



namespace dbiparser
{
    public class importCSV
    {

        private string arquivo;
        private ARQUIVOPROP arqprop;
        private string _msg;
        public string MSG
        {
            get { return _msg; }
        }

        public ARQUIVOPROP PROPRIEDADESARQUIVO
        {
            get { return arqprop; }
        }

        public importCSV()
        { 
        
        }

        public bool validarArquivo(string _arquivo, string _tipoArquivo)
        {
            bool ret = false;
            arqprop = new ARQUIVOPROP() { 
                CAMINHO = _arquivo,
                NOMEARQUIVO = Path.GetFileName(_arquivo)
            };
            carregarArquivo(_arquivo, _tipoArquivo);

            ret = arqprop.HEADERVALIDO;

            return ret;
        }


        private void carregarArquivo(string _arquivo, string _tipoArquivo)
        {
            string _conteudo = "";
            Encoding enc = Encoding.GetEncoding("ISO-8859-1");
            FileInfo fi = new FileInfo(_arquivo);
            if (fi.Exists)
            {
                StreamReader sr = new System.IO.StreamReader(_arquivo, enc);
                _conteudo = sr.ReadToEnd();
                sr.Dispose();
                sr.Close();
                sr = null;
                var lineCount = File.ReadAllLines(_arquivo).Length;
                arqprop.QTDREGISTROS = lineCount;
                validaHeader(_arquivo, _tipoArquivo);
                validaCorpo(_arquivo, _tipoArquivo);
            }
            else
            {
                _conteudo = "";
            }
            fi = null;

        }

        private void validaCorpo(string _arquivo, string _tipoArquivo)
        { 
            string[] camposHeader = new string[1];
            string line = "";
            int count = 0;
            Encoding enc = Encoding.GetEncoding("ISO-8859-1");
            StreamReader sr = new System.IO.StreamReader(_arquivo, enc);
            string[] campos = new string[1];
            switch (_tipoArquivo)
            {
                case "3":
                    camposHeader = new string[]
                    {
                        "CODIGO", "EMPRESA", "FILIAL", "CNPJ", "RAZAO", "FANTASIA", "LOGRADOURO", "NUM", "COMPLEMENTO", "BAIRRO", "MUNICIPIO", "UF", "CEP", "IE", "IBGE", "CCM", "CNAE", "SUFRAMA" 
                    };
                    _msg = "";
                    line = "";
                    arqprop.CORPOVALIDO = true;
                    while (!sr.EndOfStream)
                    {
                        line = sr.ReadLine();

                        campos = line.Split(';');
                        if (campos.Length >= 18)
                        {


                            for (int i = 0; i < 18; i++)
                            {
                                switch (i)
                                {
                                    case 0:
                                    case 3:
                                    case 4:
                                        if (campos[i].ToString().Trim().Length == 0)
                                        {
                                            arqprop.CORPOVALIDO = false;
                                            _msg = _msg + string.Format("\n O campo {0} não contem nenhuma informação na linha {1} do CSV.", camposHeader[i].ToString(), count.ToString());
                                        }
                                        break;
                                    default:

                                        break;
                                }
                            }
                        }
                        else
                        {
                            arqprop.CORPOVALIDO = false;
                            _msg = _msg + string.Format("\n A Linha {0} do CSV não contem o numero de campos mínimo.", count.ToString());
                        }
                        count++;
                    }
                    

                    

                    break;
                case "4":
                    camposHeader = new string[]
                    {
                        "CODIGO", "EMPRESA", "FILIAL", "CPF", "NOME", "LOGRADOURO", "NUM", "COMPLEMENTO", "BAIRRO", "MUNICIPIO", "UF", "CEP","IBGE"
                    };
                    _msg = "";
                    line = "";
                    arqprop.CORPOVALIDO = true;
                    while (!sr.EndOfStream)
                    {
                        line = sr.ReadLine();

                        campos = line.Split(';');
                        if (campos.Length == 13)
                        {


                            for (int i = 0; i < 13; i++)
                            {
                                switch (i)
                                {
                                    case 0:
                                    case 3:
                                    case 4:
                                        if (campos[i].ToString().Trim().Length == 0)
                                        {
                                            arqprop.CORPOVALIDO = false;
                                            _msg = _msg + string.Format("\n O campo {0} não contem nenhuma informação na linha {1} do CSV.", camposHeader[i].ToString(), count.ToString());
                                        }
                                        break;
                                    default:

                                        break;
                                }
                            }
                        }
                        else
                        {
                            arqprop.CORPOVALIDO = false;
                            _msg = _msg + string.Format("\n A Linha {0} do CSV não contem o numero de campos mínimo.", count.ToString());
                        }
                        count++;
                    }




                    break;
            }
            sr.Dispose();
            sr.Close();
            sr = null;
        }

        private void validaHeader(string _arquivo, string _tipoArquivo)
        {
            string[] camposHeader = new string[1];
            string line = "";
            Encoding enc = Encoding.GetEncoding("ISO-8859-1");
            StreamReader sr = new System.IO.StreamReader(_arquivo, enc);
            string[] campos = new string[1];        
            switch (_tipoArquivo)
            {
                case "3":
                    camposHeader = new string[]
                    {
                        "CODIGO", "EMPRESA", "FILIAL", "CNPJ", "RAZAO", "FANTASIA", "LOGRADOURO", "NUM", "COMPLEMENTO", "BAIRRO", "MUNICIPIO", "UF", "CEP", "IE", "IBGE", "CCM", "CNAE", "SUFRAMA" 
                    };
                    _msg = "";
                    line = "";
                    if (!sr.EndOfStream)
                    {
                        line = sr.ReadLine();
                    }


                    campos = line.Split(';');
                    if (campos.Length >= 18)
                    {
                        arqprop.HEADERVALIDO = true;

                        for (int i = 0; i < 18; i++)
                        {
                            if (campos[i].ToUpper() != camposHeader[i])
                            {
                                arqprop.HEADERVALIDO = false;
                                _msg = _msg + string.Format("\n O campo {0} não está na posição {1} do CSV.", camposHeader[i].ToString(), (i + 1).ToString());
                            }
                        }
                    }
                    else
                    {
                        arqprop.HEADERVALIDO = false;
                    }

                    break;
                case "4":
                    camposHeader = new string[]
                    {
                        "CODIGO", "EMPRESA", "FILIAL" , "CPF", "NOME", "LOGRADOURO", "NUM", "COMPLEMENTO", "BAIRRO", "MUNICIPIO", "UF", "CEP", "IBGE" 
                    };
                    _msg = "";
                    line = "";
                    if (!sr.EndOfStream)
                    {
                        line = sr.ReadLine();
                    }
                   
                    campos = line.Split(';');
                    if (campos.Length == 13)
                    {
                        arqprop.HEADERVALIDO = true;

                        for (int i = 0; i < 13; i++)
                        {
                            if (campos[i].ToUpper() != camposHeader[i])
                            {
                                arqprop.HEADERVALIDO = false;
                                _msg = _msg + string.Format("\n O campo {0} não está na posição {1} do CSV.", camposHeader[i].ToString(), (i + 1).ToString());
                            }
                        }
                    }
                    else
                    {
                        arqprop.HEADERVALIDO = false;
                    }

                    break;
            }
            sr.Dispose();
            sr.Close();
            sr = null;
        }

        public class ARQUIVOPROP
        {
            public string CAMINHO { get; set; }
            public string CONTEUDO { get; set; }
            public string NOMEARQUIVO { get; set; }
            public int QTDREGISTROS { get; set; }
            public bool HEADERVALIDO { get; set; }
            public bool CORPOVALIDO { get; set; }
            public bool VALIDO { get; set; }
            public int IDUSER { get; set; }
        }



        public class CNPJ
        { 
            public string CODIGO { get; set; }
            public string EMPRESA { get; set; }
            public string FILIAL { get; set; }
            public string CODCNPJ { get; set; }
            public string RAZAO { get; set; }
            public string FANTASIA { get; set; }
            public string LOGRADOURO { get; set; }
            public string NUM { get; set; }
            public string COMPLEMENTO { get; set; }
            public string BAIRRO { get; set; }
            public string MUNICIPIO { get; set; }
            public string UF { get; set; }
            public string CEP { get; set; }
            public string IE { get; set; }
            public string IBGE { get; set; }
            public string CCM { get; set; }
            public string CNAE { get; set; }
            public string SUFRAMA { get; set; }

        }

        public class CPF
        { 
            public string CODIGO { get; set; }
            public string EMPRESA { get; set; }
            public string FILIAL { get; set; }
            public string CODCPF { get; set; }
            public string NOME { get; set; }
            public string LOGRADOURO { get; set; }
            public string NUM { get; set; }
            public string COMPLEMENTO { get; set; }
            public string BAIRRO { get; set; }
            public string MUNICIPIO { get; set; }
            public string UF { get; set; }
            public string CEP { get; set; }

        }
    }
}
